#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：享元模式.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/1 23:20 
"""

"""
享元模式 (Flyweight Pattern)
享元模式是一种结构型设计模式，它旨在通过共享尽可能多的对象来减少内存使用和提高性能。它适用于大量对象存在但是具有大量共同特征，可以共享这些特征，从而减少内存消耗。

在 Python 中，享元模式通常通过一个工厂来创建和管理共享的对象。以下是一个简单的示例：

在这个示例中，Flyweight 类代表具体的享元对象，它包含了共享的状态。FlyweightFactory 类是享元工厂，负责创建和管理共享的享元对象。

客户端代码通过享元工厂获取共享的享元对象，并传递独特的状态。如果工厂已经有了对应共享状态的享元对象，则直接返回，否则创建一个新的享元对象并添加到工厂中。

享元模式适用于需要大量对象的情况，但是这些对象之间有很多共享的特征，通过共享这些特征可以减少内存消耗。通过使用享元模式，可以提高系统的性能和效率。
"""


class Flyweight:
	def __init__(self, shared_state):
		self._shared_state = shared_state

	def operation(self, unique_state):
		print(f"共享状态: {self._shared_state}, 独特状态: {unique_state}")


class FlyweightFactory:
	def __init__(self):
		self._flyweights = {}

	def get_flyweight(self, shared_state):
		if shared_state not in self._flyweights:
			self._flyweights[shared_state] = Flyweight(shared_state)
		return self._flyweights[shared_state]

	def list_flyweights(self):
		count = len(self._flyweights)
		print(f"共有 {count} 个享元对象:")
		for flyweight in self._flyweights.values():
			print(flyweight)


# 客户端代码
if __name__ == "__main__":
	factory = FlyweightFactory()

	flyweight1 = factory.get_flyweight("共享状态1")
	flyweight1.operation("独特状态1")

	flyweight2 = factory.get_flyweight("共享状态2")
	flyweight2.operation("独特状态2")

	factory.list_flyweights()
